﻿using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Windows;
using System.Data.SQLite;
using Microsoft.Win32;
using System.Data;

namespace lp1415_5605
{
    class GetDataDb
    {
        /// <summary>
        /// Variavel que vai guardar o conteudo da tabela da BD
        /// </summary>
        public String[][] table_data = null;

        /// <summary>
        /// Constructor da Classe
        /// </summary>
        /// <param name="databaseName">Nome da Base de Dados a ler</param>
        public GetDataDb(String databaseName)
        {
            //Abre a conexão à bd.
            SQLiteConnection conn = new SQLiteConnection();
            conn.ConnectionString = "Data Source=" + databaseName + ";New=True;Compress=True;Version=3;Synchronous=Off";
            conn.Open();

            //Cria um objecto do tipo SQLiteCommand, que permite exectar comandos SQL na BD criada
            SQLiteCommand cmd = new SQLiteCommand();
            cmd = conn.CreateCommand();

            //Apagamos a tabela da BD caso já exista
            //Atribui a Query SQL ao Objecto
            cmd.CommandText = String.Format("SELECT * FROM Dados");
            //Executa a Query SQL previamente atribuida ao comando e guarda o resultado da query num objecto DataReader
            SQLiteDataReader rdr = cmd.ExecuteReader();

            //Lista auxiliar para ler todo o conteudo da BD
            //Como o SQLiteDataReader não diz quantos registos existem, não conseguimos criar um array de dimensão fixa
            //por isso optou-se por usar uma lista(tamanho variavel).
            List<string[]> data = new List<string[]>();

            while (rdr.Read())
            {
                data.Add(new string[] { rdr.GetString(1), rdr.GetString(2), rdr.GetString(3), rdr.GetString(4), rdr.GetString(5), rdr.GetString(6), rdr.GetString(7), rdr.GetString(8), rdr.GetString(9) });
            }

            this.table_data = data.ToArray();
        }

        /// <summary>
        /// Método responsável por consultar os dados da coluna Ano
        /// </summary>
        /// <returns>Dados da coluna Ano</returns>
        public String[] getYears()
        {
            return this.getDataCol(0);
        }

        /// <summary>
        /// Método responsável por consultar e retornar os dados da coluna IPC_Global
        /// </summary>
        /// <returns>Dados da coluna IPC_Global</returns>
        public String[] getIpcCol()
        {
            return this.getDataCol(1);
        }

        /// <summary>
        /// Método responsável por consultar e retornar os dados da coluna Variacao_Anual
        /// </summary>
        /// <returns>Dados da coluna Variacao_Anual</returns>
        public String[] getInflationRateCol()
        {
            return this.getDataCol(2);
        }

        /// <summary>
        /// Método responsável por consultar e retornar os dados da coluna Remuneracao_minima_mensal
        /// </summary>
        /// <returns>Dados da coluna Remuneracao_minima_mensal</returns>
        public String[] getMinimumMonthlyPayCol()
        {
            return this.getDataCol(3);
        }

        /// <summary>
        /// Método responsável por consultar e retornar os dados da coluna Remuneracao_maxima_mensal
        /// </summary>
        /// <returns>Dados da coluna Remuneracao_maxima_mensal</returns>
        public String[] getMaximumMonthlyPayCol()
        {
            return this.getDataCol(4);
        }

        /// <summary>
        /// Método responsável por consultar e retornar os dados da coluna PIB_per_capita_anual
        /// </summary>
        /// <returns>Dados da coluna PIB_per_capita_anual</returns>
        public String[] getPibPerCapitaCol()
        {
            return this.getDataCol(5);
        }

        /// <summary>
        /// Método responsável por consultar e retornar os dados da coluna Rendimento_nacional_bruto_per_capita_anual
        /// </summary>
        /// <returns>Dados da coluna Rendimento_nacional_bruto_per_capita_anual</returns>
        public String[] getRNBPerCapitaCol()
        {
            return this.getDataCol(6);
        }

        /// <summary>
        /// Método responsável por consultar e retornar os dados da coluna Rendimento_disponivel_bruto_per_capita_anual
        /// </summary>
        /// <returns>Dados da coluna Rendimento_disponivel_bruto_per_capita_anual</returns>
        public String[] getRDBPerCapitaCol()
        {
            return this.getDataCol(7);
        }

        /// <summary>
        /// Método responsável por consultar e retornar os dados da coluna Remuneracoes_per_capita_anual
        /// </summary>
        /// <returns>Dados da coluna Remuneracoes_per_capita_anual</returns>
        public String[] getPerCapitaAnnualRenumerationCol()
        {
            return this.getDataCol(8);
        }

        /// <summary>
        /// Método responsável por ler uma coluna da tabela da Base de Dados
        /// </summary>
        /// <param name="col">Index da Coluna a ser lida</param>
        /// <returns>Todos os registos da coluna lida</returns>
        private String[] getDataCol(int col)
        {
            List<string> result = new List<string>();

            foreach (String[] row in this.table_data)
            {
                if (row[col].Equals(""))
                {
                    result.Add("0");
                }
                else
                {
                    result.Add(row[col]);
                }
            }
            return result.ToArray();
        }
    }
}
